#pragma once

#include <iostream>
#include <string>

#include <sys/types.h>
#include <sys/socket.h>

// 工具篇
class Util
{
public:
    static int ReadLine(int sock, std::string &out)
    {
        int ch = 'a';
        while(ch != '\n')
        {
            ssize_t s = recv(sock, &ch, 1, 0);
            if(s > 0)
            {
                if(ch == '\r')
                {
                    recv(sock, &ch, 1, MSG_PEEK);   // 窥探下一个字符到底是什么
                    if(ch == '\n'){
                        // 要将 \r\n -> \n
                        recv(sock, &ch, 1, 0);  // ch = '\n'
                    }
                    else{
                        // 下一个是普通字符
                        ch = '\n';      // 让当前ch = '\n'
                    }
                }
                // 此时 ch = 普通字符 || ch = '\n'
                out.push_back(ch);
            }
            else if(s == 0){     // 读完了
                return 0;
            }
            else{   // 读入出错
                return -1;
            }
        }
        return out.size();
    }

    // 切分字符串
    static bool CutString(const std::string &line, std::string &key_out, std::string &value_out, std::string sep)
    {
        auto pos = line.find(sep);
        if(pos != std::string::npos)
        {
            key_out = line.substr(0, pos);
            value_out = line.substr(pos + sep.size());
            return true;
        }
        return false;
    }
};
